perm filename YEAR.SAI[YTD,BGB] blob sn#051808 filedate 1973-07-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN	"YEAR"
C00005 00003	α SUBROUTINES OTIME, TOTAL, PRNTOT
C00007 00004	α HEAP SORT
C00011 00005	α FILE OPENING CEREMONIES
C00015 00006	α SCAN'A'LINE OF INPUT LOOP
C00017 00007	α ACCUMULATE GRAND TOTALS
C00020 00008	α PRINT THE CLASS CPU TIME TOTALS
C00022 00009	α CONVERT KILO-CORE-SECONDS INTO AVERAGE JOB SIZE
C00025 ENDMK
C⊗;
BEGIN	"YEAR"
	REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
	REQUIRE "HEAP1D" LOAD_MODULE;
	REQUIRE 2000 NEW_ITEMS;
	REQUIRE 2000 PNAMES;
	DEFINE SUBR="SIMPLE PROCEDURE";

α IO VARIABLES;
	INTEGER CNT,BRK,EOF,CHR,FLG,I,J;
	STRING LINE;
	INTEGER ITEMVAR IPROG;
	INTEGER BUG;

α DECLARE ALL THEM PROGRAMMERS;
	INTEGER	ITEM  PM,REB,GAR,GUE,
	 JWG,MBS, CT,RS1,SLM,BMJ,
	 MIB,EMC,JMG,MUZ,MUS,TVR,
	 SYS,REG,JRL,JAM,PJS,SRS,
	 JHS,DCS,RHT,TES,EHS,JOE,
	 GJG,AIL,AKC, WD,CCG,IGR,
	 RLL, ZM,JMC,RGM,SAN,MAL,
	 BWP,JEV,RWW,PDQ, BO,RBT,
	 MJH,PLF, SL,JGC,BLF, AH,
	 MHR,CJR,YAW,GJA,TOB,SHY,
	 YYY, GG,RKN,RPO,LOU,KKP,
	 VDS,JAF,BGB,AKI,AJT,DFD,
	 RPH,H,FW,ELM,PMP,DWP,MJW,TED,
	 GHB,DGB,KMC,KRD,HJE,ME,FDH,
	 TM1,HPM,VRP,CKR,EDS,ROG,DAV,JYS,JRB;

α DECLARE MAJOR GROUPS;
	SET MUSIC,MARS,ROBOTS,SYSTEMS,MTC,HMF,FOONLY,OTHERS,MT;
	DEFINE MUSIC#="1", MARS#="2", ROBOTS#="3", SYSTEMS#="4",
	MTC#="5", HMF#="6", FOONLY#="7", MT#="8", OTHERS#="9";

α YEAR TIL DATE DATA FOR EACH PPPN;
	DEFINE SIZ = "2000";
	SAFE ITG ARRAY PRJ,LOG,TTY,CPU,KCS[1:SIZ],PRG[0:SIZ];
	SAFE ITG ARRAY TTY#,CPU#,KCS#[1:SIZ];
	INTEGER K,L,M;
	INTEGER PPNCNT;
	INTEGER ARRAY CLASS[1:500];  α LIKE SCHOOL...;
	SUBR OSTR (STRING S); ⊂ OUTSTR(S);OUT(2,S) ⊃;
α SUBROUTINES OTIME, TOTAL, PRNTOT;
α __________________________________________________________________;
SUBR OTIME (INTEGER MINUTES);
BEGIN "OTIME"
	INTEGER DAYS,HOURS,MINS;
	MINS	←	MINUTES MOD 60;
	HOURS	←	(MINUTES DIV 60) MOD 24;
	DAYS	←	MINUTES DIV (24*60);
	SETFORMAT(4,7);	OSTR(CVS(DAYS)&" DAYS ");
	SETFORMAT(2,7);	OSTR(CVS(HOURS)&":");
	SETFORMAT(-2,7);OSTR(CVS(MINS));
END "OTIME";
α __________________________________________________________________;
	INTEGER X1,X2,X3;
SUBR TOTAL (INTEGER I);
BEGIN
	TTY[I]←TTY[I]+X1;
	CPU[I]←CPU[I]+X2;
	KCS[I]←KCS[I]+X3;
END;
α __________________________________________________________________;
SUBR PRNTOT (INTEGER I; SET S; STRING STR);
BEGIN
	ITEMVAR IPROG;
	OSTR(↓&STR&" TOTALS."&↓);
	∀ IPROG|IPROGεS DO OSTR(CVIS(IPROG,FLG)&"," );OSTR(↓);
	OSTR("	CPU TIME	");
	OTIME(CPU[I]%60);
	OSTR(9&9&CVS(100*CPU[I]%CPU[SIZ])&" PERCENT OF TOTAL."&↓);
	OSTR("	"&CVS(KCS[I])&" KILO CORE SECONDS");
	OSTR(9&9&CVS(100*KCS[I]%KCS[SIZ])&" PERCENT OF TOTAL."&↓);
	OSTR("	CONSOLE TIME	");
	OTIME(TTY[I]);
	OSTR(9&9&CVS(100*TTY[I]%TTY[SIZ])&" PERCENT OF TOTAL."&↓);
	OSTR(↓);
END;
α __________________________________________________________________;
α HEAP SORT;
α ARRAY-A ARE THE KEYS, ARRAY-B ARE THE RECORDS;
α __________________________________________________________________;
SUBR HEAP1D (ITG ARRAY A,B; INTEGER N);
BEGIN "HEAPSORT"
	ITG I,J,K,X,Y;

α PUT'EM UNDER THE HEAP & ALLOW THE BIGGIES TO TRICKLE UP;

	FOR K←2 STEP 1 UNTIL N DO
	BEGIN
		I←K;
		X←A[I]; Y←B[I];
		WHILE I>1 ∧ X>A[J←I%2] DO
		BEGIN A[I]←A[J];B[I]←B[J];I←J END;
		A[I]←X;B[I]←Y;
	END;

α TAKE 'EM OFF THE TOP & PROMOTE SUBORDINATES;

	FOR K←N STEP -1 UNTIL 2 DO
	BEGIN
		X←A[K];Y←B[K];A[K]←A[1];B[K]←B[1];I←1;
		WHILE (J←2*I)<K DO
		BEGIN
			IF (J+1)<K ∧ A[J+1]>A[J] THEN J←J+1;
			IF X≥A[J] THEN DONE ELSE
			⊂ A[I]←A[J];B[I]←B[J];I←J ⊃;
		END;
		A[I]←X;B[I]←Y;
	END;
END "HEAPSORT";
α __________________________________________________________________;
α FILE OPENING CEREMONIES;
	OUTSTR(↓&↓&"GIGO WARNING !!!"&↓&"
	The  YTD files  on  [ACT,SYS]  are  not quite  accurate  with
respect  to format or  sane statistical values.   A YTD  file must be
inspected and edited before use. Look for ridiculously  large values,
negative values,  numbers with  several decimal  points, colons,   as
well as for bad PPPN's and missing delimiters."&↓&↓);
	OPEN(2,"DSK",0,0,3,0,0,0);ENTER(2,"O",0);
	OPEN(1,"DSK",0,3,0,CNT,BRK,EOF);
	⊂ STRING FILNAM; OUTSTR(" YTD OR MONTH NAME = ");
	  FILNAM ← INCHWL;
	  LOOKUP(1,FILNAM,FLG);
	  IF FLG THEN LOOKUP(1,FILNAM&"[ACT,SYS]",FLG);
	  IF FLG THEN ⊂ FILNAM←"YTD";
	  LOOKUP(1,"YTD[ACT,SYS]",FLG) ⊃;
	  OSTR(↓&↓&"YEAR TO DATE ANALYSIS OF FILE ");
	  OSTR(FILNAM&↓&↓);⊃;

α DECLARE SCAN BREAK CHARACTERS;
	BREAKSET(1,13,"I");
	BREAKSET(1,10,"O");
	FOR I←1 TIL 6 DO ⊂ CNT←120;LINE←INPUT(1,1) ⊃;
	BREAKSET(2, 9,"I");
	BREAKSET(2," ","O");
	BREAKSET(3,",]","I");
	BREAKSET(3,"[","O");

α PROJECT GROUPS;
	MUSIC ← {PM,REB,GAR,JWG,MBS,CT,RS1,SLM,BMJ,JAM,
		MIB,EMC,JMG,MUZ,MUS};
	SYSTEMS←{SYS,REG,JRL,PJS,SRS,JHS,DCS,FW,AIL,GUE,
		RHT,TES,JOE,GJG};
	MTC←{AKC,WD,CCG,IGR,RLL,ZM,JMC,RGM,SAN,MAL,BWP,JEV,RWW};
	MARS←{PDQ,BO,RBT,MJH,PLF,SL};
	ROBOTS←{GJA,TOB,SHY,GG,YYY,RKN,RPO,LOU,KKP,TVR,
		VDS,JAF,BGB,AKI,AJT,DFD};
	FOONLY←{RPH,H,ELM,PMP,DWP,MJW,TED,EHS};
	HMF←{GHB,DGB,KMC,KRD,HJE,ME,FDH,TM1,HPM,VRP,
		CKR,EDS,ROG,DAV,JYS,JRB};
	MT←{JGC,BLF,AH,MHR,CJR,YAW};

α ASSIGN PROJECT SERIAL NUMBERS;
	∀ IPROG | IPROGεMUSIC 	DO ∂(IPROG) ← SIZ - MUSIC#;
	∀ IPROG | IPROGεMARS  	DO ∂(IPROG) ← SIZ - MARS#;
	∀ IPROG | IPROGεSYSTEMS	DO ∂(IPROG) ← SIZ - SYSTEMS#;
	∀ IPROG | IPROGεROBOTS 	DO ∂(IPROG) ← SIZ - ROBOTS#;
	∀ IPROG | IPROGεMTC    	DO ∂(IPROG) ← SIZ - MTC#;
	∀ IPROG | IPROGεHMF    	DO ∂(IPROG) ← SIZ - HMF#;
	∀ IPROG | IPROGεFOONLY 	DO ∂(IPROG) ← SIZ - FOONLY#;
	∀ IPROG | IPROGεMT     	DO ∂(IPROG) ← SIZ - MT#;
α SCAN'A'LINE OF INPUT LOOP;
WHILE TRUE DO
BEGIN	"INPUT SCAN"
	STRING LINE,PPNSTR,PJSTR,PGSTR,LOGSTR,TTYSTR,CPUSTR,KCSSTR;
	INTEGER PROGMR,PROJCT;

α READ'A'LINE;
	CNT←120;LINE←INPUT(1,1);
	IF EOF THEN DONE;

α READ THE PPPN - [PRJ,PRG];
	PPNSTR ← SCAN(LINE,2,CHR);
	PJSTR  ← SCAN(PPNSTR,3,CHR);	PROJCT ← INTSCAN(PJSTR,CHR);
	PGSTR  ← SCAN(PPNSTR,3,CHR);	PROGMR ← CVSIX(PGSTR);

α DISTINGUISH A NEW MAN;
	IF PROGMR≠PRG[M] THEN ⊂ PRG[M←M+1]←PROGMR; L←0; ⊃;
	PRJ[M]←PRJ[M]+1;
	L←L+1; PPNCNT←PPNCNT+1;

α READ PPPN'S STATISTICS: LOGINS, CONSOLE h:m, CPU m:s, KCS;
	LOGSTR ← SCAN(LINE,2,CHR);
	TTYSTR ← SCAN(LINE,2,CHR);
	CPUSTR ← SCAN(LINE,2,CHR);
	KCSSTR ← SCAN(LINE,2,CHR);

α ACCUMULATE INDIVIDUAL TOTALS;
	LOG[M] ← LOG[M] + INTSCAN(LOGSTR,CHR);
	X1 ← INTSCAN(TTYSTR,CHR)*60 + INTSCAN(TTYSTR,CHR);
	X2 ← INTSCAN(CPUSTR,CHR)*60 + INTSCAN(CPUSTR,CHR);
	X3 ← INTSCAN(KCSSTR,CHR);
	TTY[M] ← TTY[M] + X1;
	CPU[M] ← CPU[M] + X2;
	KCS[M] ← KCS[M] + X3;

α ACCUMULATE CLASS TOTALS;
	IF PROJCT≥1 ∧ PROJCT≤500 THEN
	CLASS[PROJCT] ← CLASS[PROJCT] + X2;

α LOOKUP HIS GROUP NUMBER AND ACCUMULATE GROUP TOTALS;
	IPROG ← CVSI(PGSTR,FLG);
	IF FLG THEN TOTAL(SIZ-OTHERS#) ELSE TOTAL(∂(IPROG));

END "INPUT SCAN";

	RELEASE(1);
	OUTSTR("EOF"&↓);
α ACCUMULATE GRAND TOTALS;
	J←0; FOR I←1 STEP 1 UNTIL M DO J←J+LOG[I]; LOG[SIZ]←J;
	J←0; FOR I←1 STEP 1 UNTIL M DO J←J+TTY[I]; TTY[SIZ]←J;
	J←0; FOR I←1 STEP 1 UNTIL M DO J←J+CPU[I]; CPU[SIZ]←J;
	J←0; FOR I←1 STEP 1 UNTIL M DO J←J+KCS[I]; KCS[SIZ]←J;

α PRINT GRAND TOTALS;
	OSTR("A FICTIONAL YEAR TO DATE ANALYSIS  -  JAN to JUN 1973.

	I have edited Ralph Gorin's YTD[ACT,SYS] file to remove
impossibly large numbers, and numbers printed without delimiters,
and PPPN's and numbers printed with too few or too many delimiters.
Consequently the following analysis is a fiction, and any similarity
between these characters and persons living or dead is a coincidence.
"&↓);
	OSTR("RAW GRAND TOTALS."&↓);
	SETFORMAT(10,7);
	OSTR("			"&CVS(M)&" PROGRAMMERS"&↓);
	OSTR("			"&CVS(PPNCNT)&" PPPN'S"&↓);
	OSTR("			"&CVS(LOG[SIZ])&" LOGIN'S"&↓);
	OSTR("	CONSOLE TIME 	"&CVS(TTY[SIZ])&" MINUTES"&↓);
	OSTR("	CPU TIME	"&CVS(CPU[SIZ])&" SECONDS"&↓);
	OSTR("			"&CVS(KCS[SIZ])&" KILO CORE SECONDS"&↓);
		OSTR(↓);
		OSTR("EQUIVALENT GRAND TOTALS."&↓);
	OSTR("	CONSOLE TIME	");
	OTIME(TTY[SIZ]); OSTR(↓);
	OSTR("	CPU TIME	");
	OTIME(CPU[SIZ]%60); OSTR(↓);

α PRINT THE GROUP TOTALS;
	PRNTOT(SIZ-SYSTEMS#,SYSTEMS,	"SYSTEMS AND NET");
	PRNTOT(SIZ-ROBOTS#,ROBOTS,	"ROBOTICS");
	PRNTOT(SIZ-MUSIC#,MUSIC,	"MUSIC");
	PRNTOT(SIZ-FOONLY#,FOONLY,	"FOONLY");
	PRNTOT(SIZ-HMF#,HMF,		"HIGHER MENTAL FUNCTIONS");
	PRNTOT(SIZ-MTC#,MTC,		"MATHEMATICAL THEORY OF COMPUTATION");
	PRNTOT(SIZ-MT#,MT,		"MACHINE TRANSLATION");
	PRNTOT(SIZ-MARS#,MARS,		"MARS");
	PRNTOT(SIZ-OTHERS#,OTHERS,	"OTHERS");

α PRINT THE CLASS CPU TIME TOTALS;
	OSTR(↓&"TOTAL CPU TIME BY NUMERIC PROJECTS 20 TIL 500"&↓);
	OSTR("   which are alleged to be university course numbers."&↓);
	FOR I←20 TIL 500 DO
	IF CLASS[I]>60 THEN
BEGIN	"CLASS"
	INTEGER CPUTIM;
	OSTR(9&"COURSE #"&CVS(I)&9);
	CPUTIM←(CLASS[I])%60;
	SETFORMAT(3,7);
	OSTR(CVS(CPUTIM%60)&":");
	SETFORMAT(-2,7);
	OSTR(CVS(CPUTIM MOD 60));
	IF I=220 THEN OSTR(9&"MUSIC") ELSE
	IF I=206 THEN OSTR(9&"LISP") ELSE
	IF I=390 THEN OSTR(9&"ADV READING & RESEARCH") ELSE
	IF I=347 THEN OSTR(9&"HIGH SCHOOL HACKER - SMG") ELSE
	IF I=225 THEN OSTR(9&"ARTIFICIAL INTELLIGENCE") ELSE
	IF I=226 THEN OSTR(9&"REPRESENTATION IN A.I.") ELSE
	IF I=256 THEN OSTR(9&"MATHEMATICAL THEORY OF COMPUTATION") ELSE
	IF I=293 THEN OSTR(9&"COMPUTER LAB") ELSE
	IF I=137 THEN OSTR(9&"NUMERICAL ANALYSIS") ELSE
	IF I=140 THEN OSTR(9&"SYSTEMS PROGRAMMING") ELSE
	IF I=144 THEN OSTR(9&"DATA STRUCTURES");
	OSTR(↓);
END "CLASS";
α CONVERT KILO-CORE-SECONDS INTO AVERAGE JOB SIZE;
	FOR I←1 TIL M DO IF CPU[I]>10 THEN
	KCS[I] ← (KCS[I] / CPU[I]) ELSE KCS[I]←0; α HIM TOO SMALL;
α SORT ON EACH DATA FIELD;
	FOR I←1 TIL M DO TTY#[I]←CPU#[I]←KCS#[I]←I;
	HEAP1D(TTY,TTY#,M);
	HEAP1D(CPU,CPU#,M);
	HEAP1D(KCS,KCS#,M);
α TYPE OUT THE VILLAINS;
	OSTR(↓&↓);
	OSTR("THE RANK ORDER OF OUTSTANDING USERS"&↓);
	OSTR(↓&"RANK 	CPU-TIME HR:MIN	");
	OSTR(9&"AVERAGE-JOB-SIZE	CONSOLE-TIME"&↓);

α OUTPUT A LINE OF RANK ORDER;
	FOR I←M STEP -1 UNTIL M-200 DO
BEGIN "RANK'A'LINE"
	INTEGER CPUTIM;

α RANK ORDER;
	SETFORMAT(4,7);OSTR(CVS(M-I+1)&9);

α TOTAL CPU TIME;
	OSTR(CVXSTR(PRG[CPU#[I]])&"  ");CPUTIM←CPU[I]%60;SETFORMAT(3,7);
	OSTR(CVS(CPUTIM%60)&":");SETFORMAT(-2,7);
	OSTR(CVS(CPUTIM MOD 60)&9&9);

α AVERAGE JOB SIZE;
	SETFORMAT(2,7);
	OSTR(CVXSTR(PRG[KCS#[I]])&"  ");
	OSTR(CVS(KCS[I])&"K"&9&9);

α TOTAL CONSOLE TIME;
	OSTR(CVXSTR(PRG[TTY#[I]])&"  ");
	OTIME((TTY[I]));
	OSTR(↓);
END "RANK'A'LINE";
	RELEASE(2);
	OUTSTR(↓&9&"EOF"&↓);
END	"YEAR";